package com.itbaizhan.rocketmqproducer.producer;

import org.apache.rocketmq.client.exception.MQBrokerException;
import org.apache.rocketmq.client.exception.MQClientException;
import org.apache.rocketmq.client.producer.DefaultMQProducer;
import org.apache.rocketmq.common.message.Message;
import org.apache.rocketmq.common.message.MessageQueue;
import org.apache.rocketmq.remoting.common.RemotingHelper;
import org.apache.rocketmq.remoting.exception.RemotingException;

import java.io.UnsupportedEncodingException;
import java.util.List;

/*顺序发送消息
一个订单的顺序流程是：创建、付款、推送、完成。
订单号相同的消息会被先后发送到同一个队列中，消费时，
同一个OrderId获取到的肯定是同一个队列。*/
public class OrderProducer {
    public static void main(String[] args) throws MQClientException, UnsupportedEncodingException, RemotingException, InterruptedException, MQBrokerException {
        DefaultMQProducer producer = new DefaultMQProducer("producer_grp_01");
        producer.setNamesrvAddr("192.168.66.100:9876");
        producer.start();

        //获取指定主题下的消息队列集合  这是指定主题，不会自动创建，所以要先创建主题
        List<MessageQueue> messageQueues = producer.fetchPublishMessageQueues("topic_springboot_02");

        Message message = null;
        MessageQueue messageQueue = null;
        for (int i= 0;i<100;i++){
            //注意：一个是队列，一个是队列的集合
            //采用轮询的方式指定队列，发送订单消息，保证同一个订单的消息按顺序
            //发送到同一个队列   创建主题时会创建8个队列
            // Exception in thread "main" java.lang.IndexOutOfBoundsException: Index: 4, Size: 4
           //messageQueue= messageQueues.get(i%8);
            messageQueue= messageQueues.get(i%4);
            //创建消息，发送订单消息
            message = new Message("topic_springboot_02",("hello rocketmq order message create - "+i).getBytes(RemotingHelper.DEFAULT_CHARSET));
            producer.send(message,messageQueue);

            //发送付款消息
            message = new Message("topic_springboot_02",("hello rocketmq order message pay - "+i).getBytes(RemotingHelper.DEFAULT_CHARSET));
            producer.send(message,messageQueue);

            //发送订单送贷信息
            message = new Message("topic_springboot_02",("hello rocketmq order message delivery - "+i).getBytes(RemotingHelper.DEFAULT_CHARSET));
            producer.send(message,messageQueue);
        }

        producer.shutdown();
    }
}
